/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.compassion.action;

import com.opensymphony.xwork2.ActionContext;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Date;
import sv.com.compassion.dao.GenericoDAO;
import sv.com.compassion.entidades.Actividad;
import sv.com.compassion.util.ComunAction;
import sv.com.compassion.util.Constantes;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONObject;
import sv.com.compassion.entidades.Asistencia;
import sv.com.compassion.util.Fecha;
import sv.com.compassion.util.JqGrid;
import sv.com.compassion.util.RowsGrid;

/** Se define la interacción del mantenimiento Asistencia (Los porcentajes de asistencia y busquedas
 * por rangos de fecha)
 * @author geovany
*/
public class Asistencia2Action extends ComunAction {
    private GenericoDAO genericoDAO;
    private Actividad actividad;
    private String idAct;
    private String fecIni;
    private String fecFin;
    private String modoSea;

 /**
 *Constructor.  
 *@param GenericoDAO interface donde se encuentran los métodos para acceder a 
 * a la clase entidad Asistencia. 
 */ 
public Asistencia2Action(GenericoDAO genericoDAO){
        this.genericoDAO = genericoDAO;
} 

/**
 * Busca el método que se ejecutara
 */
    @Override
    public String execute(){
        buscarMetodo(actividad);        
        return null;
    }
       
    @Override    
    public void agregarEntidad(Object o) {
    }
    
    @Override
    public void borrarEntidad(Object o) {
    }
    
    @Override
    public void editarEntidad(Object o) {
    }
    
    
  /**
 * Este método hace las búsquedas y llenar el grid del mantenimiento Asistencia y porcentajes de está,
 * esperando los valores de los filtros:
 *       idAct : ID Actividad  <br>
 *       fecIni : Fecha de Inicio <br>
 *       fecFin : Fecha Fin <br>
 *       modoSea : Modo de búsqueda (mensual o diaria)
 */   
    @Override
    public void alimentarGrid() {
        JqGrid jg = new JqGrid();
        int total = 0;
        
        Map session = ActionContext.getContext().getSession();
        String idUsuario = session.get("idUsuario").toString();
        String idCargo = session.get("idCargo").toString();
        
        DecimalFormat df = new DecimalFormat("0.00");
        
        List<Asistencia> listaAsistencia = null;
        String query="";
        idAct = getRequest().getParameter("IdAct");
        fecIni = getRequest().getParameter("FecIni");
        fecFin = getRequest().getParameter("FecFin");
        modoSea = getRequest().getParameter("ModoSea");

        String queryFecIni = "";
        String queryFecFin = "";

        /*String queryAux = "";
        if(idCargo.equals("6") || idCargo.equals("7") || idCargo.equals("8") || idCargo.equals("9")){
            queryAux = "a.idTutor IN (SELECT t.idTutor FROM Tutor t WHERE t.idCdi IN (SELECT x.idCdi FROM Asociacion x WHERE x.idEmpleado = '" + idUsuario + "')) and ";
        }*/
        if(!fecIni.equals("") || !fecFin.equals("")){
            if(!fecIni.equals("")){
               queryFecIni = "and x.fecAsistencia >= '" + fecIni + "' ";
            }
            if(!fecFin.equals("")){
               queryFecFin = "and x.fecAsistencia <= '" + fecFin + "' ";
            }
        }
        if(modoSea.equals("1")){
            try{
                if(getSearch()!= null && getSearch().equals("true")){
                    /*query = "SELECT a FROM Actividad a  where";
                    
                    if(getNomActividad()!=null){
                        query += " upper(a.nomActividad) like upper('%"+ getNomActividad() +"%') and  ";
                    }
                    if(getDesActividad()!=null){
                        query += " upper(a.desActividad) like upper('%"+getDesActividad()+"%') and  ";
                    }
                    if(getFecFinalizacion()!=null){
                        query += " a.fecFinalizacion = '"+Fecha.date2String(Fecha.string2Date(getFecFinalizacion()),"yyyy-MM-dd")+"' and  ";
                    }
                    query = query.substring(0, query.length()-5)+" order by a.fecFinalizacion "+getSord();
                    listaActividad = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());*/
                }else{
                        query = "SELECT x FROM Asistencia x WHERE " +
                                //queryAux + 
                                "x.idActividad = '" + idAct + "' " + 
                                queryFecIni +
                                queryFecFin +
                                "GROUP BY x.fecAsistencia " +
                                "ORDER BY x.fecAsistencia " + getSord();
                }

                listaAsistencia = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());
                String query2 = "SELECT COUNT(x) FROM Asistencia x WHERE " +
                                //queryAux + 
                                "x.idActividad = '" + idAct + "' " + 
                                queryFecIni +
                                queryFecFin;
                total = genericoDAO.countRow(query2);
                //configuraciones basicas
                jg.setPage(getPage());
                jg.setRecords(total);
                jg.setTotal((int) Math.ceil((double) total / (double) getRows()));
                jg.setSord(getSord());
                jg.setSidx(getSidx());
                List<RowsGrid> rows = new ArrayList<RowsGrid>();
                
                for(Asistencia x: listaAsistencia){
                    RowsGrid r = new RowsGrid(); 
                    r.setId(x.getIdAsistencia().toString());
                    List cell = new ArrayList();
                    
                    cell.add(x.getFecAsistencia().toString());
                    
                    String annioAsist = x.getFecAsistencia().toString().substring(0,4);
                    String mesAsist = x.getFecAsistencia().toString().substring(5,7);
                    String diaAsist = x.getFecAsistencia().toString().substring(8,10);

                    double asistieron = 0;
                    double totalAsistieron = 0;        
                    asistieron = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annioAsist + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mesAsist + "' "
                            + "and DAY(x.fecAsistencia) <= '" + diaAsist + "' "
                            + "and x.idActividad = '" + idAct + "' "
                            + "and x.asistio = 1");
                    
                    totalAsistieron = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annioAsist + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mesAsist + "' "
                            + "and DAY(x.fecAsistencia) <= '" + diaAsist + "' "
                            + "and x.idActividad = '" + idAct + "' ");
                    
                    double asistAct = 0.00;
                    
                    if(totalAsistieron != 0)
                        asistAct = (asistieron/totalAsistieron)*100;
                    
                    cell.add(df.format(asistAct));
  
                    r.setCell(cell);
                    rows.add(r);                    
                }
                
                jg.setRows(rows);
                JSONObject jo = JSONObject.fromObject(jg);
                enviarJsonNavegador(getResponse(), jo);
          }catch(Exception e){
            Logger.getLogger(Asistencia2Action.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
          }
        }else{
            
            try{
                if(getSearch()!= null && getSearch().equals("true")){
                    /*query = "SELECT a FROM Actividad a  where";
                    
                    if(getNomActividad()!=null){
                        query += " upper(a.nomActividad) like upper('%"+ getNomActividad() +"%') and  ";
                    }
                    if(getDesActividad()!=null){
                        query += " upper(a.desActividad) like upper('%"+getDesActividad()+"%') and  ";
                    }
                    if(getFecFinalizacion()!=null){
                        query += " a.fecFinalizacion = '"+Fecha.date2String(Fecha.string2Date(getFecFinalizacion()),"yyyy-MM-dd")+"' and  ";
                    }
                    query = query.substring(0, query.length()-5)+" order by a.fecFinalizacion "+getSord();
                    listaActividad = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());*/
                }else{
                        query = "SELECT x FROM Asistencia x WHERE " +
                                //queryAux + 
                                "x.idActividad = '" + idAct + "' " + 
                                queryFecIni +
                                queryFecFin +
                                "GROUP BY YEAR(x.fecAsistencia), MONTH(x.fecAsistencia) " +
                                "ORDER BY x.fecAsistencia " + getSord();
                }

                listaAsistencia = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());
                query = "SELECT COUNT(x) FROM Asistencia x WHERE " +
                                //queryAux + 
                                "x.idActividad = '" + idAct + "' " + 
                                queryFecIni +
                                queryFecFin +
                                "GROUP BY YEAR(x.fecAsistencia), MONTH(x.fecAsistencia) ";
                total = genericoDAO.countRow(query);
                //configuraciones basicas
                jg.setPage(getPage());
                jg.setRecords(total);
                jg.setTotal((int) Math.ceil((double) total / (double) getRows()));
                jg.setSord(getSord());
                jg.setSidx(getSidx());
                List<RowsGrid> rows = new ArrayList<RowsGrid>();
                
                for(Asistencia x: listaAsistencia){
                    RowsGrid r = new RowsGrid(); 
                    r.setId(x.getIdAsistencia().toString());
                    List cell = new ArrayList();
                    
                    cell.add(x.getFecAsistencia().toString().substring(0, 7));
                    
                    String annioAsist = x.getFecAsistencia().toString().substring(0,4);
                    String mesAsist = x.getFecAsistencia().toString().substring(5,7);

                    double asistieron = 0;
                    double totalAsistieron = 0;        
                    asistieron = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annioAsist + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mesAsist + "' "
                            + "and x.idActividad = '" + idAct + "' "
                            + "and x.asistio = 1");
                    
                    totalAsistieron = genericoDAO.countRow("SELECT COUNT(x) FROM Asistencia x WHERE YEAR(x.fecAsistencia) = '" + annioAsist + "' "
                            + "and MONTH(x.fecAsistencia) = '" + mesAsist + "' "
                            + "and x.idActividad = '" + idAct + "' ");
                    
                    double asistAct = 0.00;
                    
                    if(totalAsistieron != 0)
                        asistAct = (asistieron/totalAsistieron)*100;
                    
                    cell.add(df.format(asistAct));
                    
                    r.setCell(cell);
                    rows.add(r);                    
                }
                
                jg.setRows(rows);
                JSONObject jo = JSONObject.fromObject(jg);
                enviarJsonNavegador(getResponse(), jo);
          }catch(Exception e){
            Logger.getLogger(Asistencia2Action.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
          }
            
        }
    }
 public Integer getIdActividad() {
        return actividad.getIdActividad();
    }

    public void setIdActividad(Integer idActividad) {
        actividad.setIdActividad(idActividad);
    }

    public String getNomActividad() {
        return actividad.getNomActividad();
    }

    public void setNomActividad(String nomActividad) {
        actividad.setNomActividad(nomActividad);
    }

    public String getDesActividad() {
        return actividad.getDesActividad();
    }

    public void setDesActividad(String desActividad) {
        actividad.setDesActividad(desActividad);
    }

    public int getEstActividad() {
        return actividad.getEstActividad();
    }

    public void setEstActividad(int estActividad) {
        actividad.setEstActividad(estActividad);
    }

    public String getFecFinalizacion() {
        return Fecha.date2String(actividad.getFecFinalizacion());
    }

    public void setFecFinalizacion(String fecFinalizacion) {
        try {
            actividad.setFecFinalizacion(Fecha.string2Date(fecFinalizacion));
        } catch (ParseException ex) {
            Logger.getLogger(ActividadAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int getAuAddUsr() {
        return actividad.getAuAddUsr();
    }

    public void setAuAddUsr(int auAddUsr) {
        actividad.setAuAddUsr(auAddUsr);
    }

    public String getAuAddDat() {
        return Fecha.date2String(actividad.getAuAddDat());
    }

    public void setAuAddDat(String auAddDat) {
        try {
            actividad.setAuAddDat(Fecha.string2Date(auAddDat));
        } catch (ParseException ex) {
            Logger.getLogger(ActividadAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public Integer getAuModUsr() {
        return actividad.getAuModUsr();
    }

    public void setAuModUsr(Integer auModUsr) {
        actividad.setAuModUsr(auModUsr);
    }

    public Date getAuModDat() {
        return actividad.getAuModDat();
    }

    public void setAuModDat(Date auModDat) {
        actividad.setAuModDat(auModDat);
    }

    public Integer getIdTutor() {
        return actividad.getIdTutor().getIdTutor();
    }

    public void setIdTutor(Integer idTutor) {
        actividad.getIdTutor().setIdTutor(idTutor);
    }

    public Integer getIdTipoActividad() {
        return actividad.getIdTipoActividad().getIdTipoActividad();
    }

    public void setIdTipoActividad(Integer idTipoActividad) {
        actividad.getIdTipoActividad().setIdTipoActividad(idTipoActividad);
    }

    public Integer getIdranEdad() {
        return actividad.getIdranEdad().getIdRangoEdad();
    }

    public void setIdranEdad(Integer idranEdad) {
        actividad.getIdranEdad().setIdRangoEdad(idranEdad);
    }

    public Integer getIdAula() {
        return actividad.getIdAula().getIdAula();
    }

    public void setIdAula(Integer idAula) {
        actividad.getIdAula().setIdAula(idAula);
    }
    
    @Override
    public void reporteXls() {       
    }
    
}


